//package com.my.geojson.test.simple.cvs;
//
//import com.csvreader.CsvReader;
//import org.geotools.data.DefaultTransaction;
//import org.geotools.data.Transaction;
//import org.geotools.data.collection.ListFeatureCollection;
//import org.geotools.data.shapefile.ShapefileDataStore;
//import org.geotools.data.shapefile.ShapefileDataStoreFactory;
//import org.geotools.data.simple.SimpleFeatureCollection;
//import org.geotools.data.simple.SimpleFeatureSource;
//import org.geotools.data.simple.SimpleFeatureStore;
//import org.geotools.feature.simple.SimpleFeatureBuilder;
//import org.geotools.geometry.jts.JTSFactoryFinder;
//import org.geotools.swing.data.JFileDataStoreChooser;
//import org.locationtech.jts.geom.Coordinate;
//import org.locationtech.jts.geom.GeometryFactory;
//import org.locationtech.jts.geom.Point;
//import org.opengis.feature.simple.SimpleFeature;
//import org.opengis.feature.simple.SimpleFeatureType;
//import org.opengis.geometry.Geometry;
//
//import javax.swing.*;
//import java.io.File;
//import java.io.IOException;
//import java.io.Serializable;
//import java.nio.charset.StandardCharsets;
//import java.util.ArrayList;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//
///**
// * 解析csv文件
// */
//public class CvsFile {
//    //解析csv文件
//    private static List<SimpleFeature> readCsv2Feature(SimpleFeatureType type, File file) throws IOException {
//        //A list to collect features as we create them.
//        List<SimpleFeature> features = new ArrayList<>();
//        //首先我们通过要素类型构建简单要素构建器。
//        SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(type);
//        //构建空间要素工厂GeometryFactory。
//        // 通过这个工厂方法，我们可以创建出点、线、面要素。
//        // 需要注意的是，这个方法只创建创建空间要素，并不会创建属性信息。
//        GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory();
//        //将点地理实体以及其他属性信息添加到要素构建器中。
//        CsvReader csvReader = new CsvReader(file.getAbsolutePath(), ',', StandardCharsets.UTF_8);
//        //获取表头
//        csvReader.readHeaders();
//        while (csvReader.readRecord()) {
//            Double latitude = Double.parseDouble(csvReader.get(0));
//            Double longitude = Double.parseDouble(csvReader.get(1));
//            String name = csvReader.get(2).trim();
//            int number = Integer.parseInt(csvReader.get(3).trim());
//
//            Point point = geometryFactory.createPoint(new Coordinate(longitude, latitude));
//            featureBuilder.add(point);
//            featureBuilder.add(name);
//            featureBuilder.add(number);
//            //通过要素构建器构建要素SimpleFeature。
//            SimpleFeature feature = featureBuilder.buildFeature(null);
//            //放入要素集合。
//            features.add(feature);
//        }
//        return features;
//    }
//    //创建shp文件
//    private static File getNewShapeFile(File csvFile) {
//        String path = csvFile.getAbsolutePath();
//        String newPath = path.substring(0, path.length() - 4) + ".shp";
//
//        JFileDataStoreChooser chooser = new JFileDataStoreChooser("shp");
//        chooser.setDialogTitle("Save shapefile");
//        chooser.setSelectedFile(new File(newPath));
//
//        int returnVal = chooser.showSaveDialog(null);
//
//        if (returnVal != JFileDataStoreChooser.APPROVE_OPTION) {
//            // the user cancelled the dialog
//            System.exit(0);
//        }
//        File newFile = chooser.getSelectedFile();
//        if (newFile.equals(csvFile)) {
//            System.out.println("Error: cannot replace " + csvFile);
//            System.exit(0);
//        }
//        return newFile;
//    }
//
//    //要素集合保存shp文件中
//    //首先创建ShapefileDataStore，他是通过dataStoreFactory并结合特定的参数创建。
//    // 这些参数包括url(shp文件地址)以及“create spatial index”是否创建空间索引。
//    // 这里我们可以理解为一个没有表结构的表。
//    //通过newDataStore创建约束信息，此时表包含了字段信息。
//    //通过newDataStore获取要素存储featureStore，并开启事务。
//    //将要素集合放入featureStore。
//    //提交事务，shp文件得以创建。
//    //版权声明：本文为CSDN博主「surpassLiang」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。
//    //原文链接：https://blog.csdn.net/oYinHeZhiGuang/article/details/118315508
//    public static void main(String[] args) throws Exception {
//        UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
//
//        File file = JFileDataStoreChooser.showOpenFile("csv", null);
//        if (file == null) {
//            return;
//        }
//
//        //Create a FeatureType
//        SimpleFeatureType type = FeatureType.createFeatureType(
//                (Class<? extends Geometry>)
//                        Point.class);
//
//        //将csv转换为feature
//        List<SimpleFeature> features = readCsv2Feature(type, file);
//
//
//        //Get an output file name and create the new shapefile
//        File newFile = getNewShapeFile(file);
//
//        ShapefileDataStoreFactory dataStoreFactory = new ShapefileDataStoreFactory();
//
//        Map<String, Serializable> params = new HashMap<>(2);
//        params.put("url", newFile.toURI().toURL());
//        params.put("create spatial index", Boolean.TRUE);
//
//        ShapefileDataStore newDataStore =
//                (ShapefileDataStore) dataStoreFactory.createNewDataStore(params);
//
//        //TYPE is used as a template to describe the file contents
//        newDataStore.createSchema(type);
//
//        //Write the features to the shapefile
//        Transaction transaction = new DefaultTransaction("create");
//
//        String typeName = newDataStore.getTypeNames()[0];
//        SimpleFeatureSource featureSource = newDataStore.getFeatureSource(typeName);
//
//        if (featureSource instanceof SimpleFeatureStore) {
//            SimpleFeatureStore featureStore = (SimpleFeatureStore) featureSource;
//            SimpleFeatureCollection collection = new ListFeatureCollection(type, features);
//            featureStore.setTransaction(transaction);
//            try {
//                featureStore.addFeatures(collection);
//                transaction.commit();
//            } catch (Exception problem) {
//                problem.printStackTrace();
//                transaction.rollback();
//            } finally {
//                transaction.close();
//            }
//            System.exit(0);
//        } else {
//            System.out.println(typeName + " does not support read/write access");
//            System.exit(1);
//        }
//    }
//
//
//
//}
